package main_thread

import (
	"sen-golang-study/go_game_study/hero_story_go_server/common/log"
	"sync"
)

// 主队列大小
const mainQSize = 2048

// 主队列
var mainQ = make(chan func(), mainQSize)

// 是否已经开始工作
var started = false
var startLocker = &sync.Mutex{}

func init() {
	if !started {
		startLocker.Lock()
		defer startLocker.Unlock()

		if !started {
			started = true
			go execute()
		}
	}
}

// PushTask 主线程将任务加入到队列中,
// 将 task 插入主队列并不真正执行!
func PushTask(task func()) {
	if nil == task {
		return
	}

	if len(mainQ) >= mainQSize {
		log.Error("主队列过于拥挤, task 被抛弃")
		return
	}

	mainQ <- task
}

// 执行 task
func execute() {
	for {
		task := <-mainQ

		if task == nil {
			continue
		}

		func() {
			defer func() {
				if err := recover(); err != nil {
					log.Error("执行任务异常：%+v:", err)
				}
			}()

			task()
		}()
		
	}
}
